Визуальное моделирование для профессионалов
Иерархия модели
Если количество блоков в модели становится слишком большим, то работать с ними становится неудобно. В этом случае несколько блоков можно объединить в подсистему.
Создание подсистемы
Существует несколько способов объединения блоков в подсистему:
- Добавить блок Subsystem (Подсистема) из библиотеки блоков, затем дважды кликнуть по нему левой кнопкой мыши (так вы войдете в подсистему) и добавить нужные блоки стандартным способом.
- Выделить блоки, которые вы хотите добавить в подсистему, с нажатой клавишей Shift, кликнуть на появившиеся точки в углу прямоугольника и нажать на иконку Подсистема
.
Внутри одной подсистемы можно создать неограниченное количество других подсистем, находящихся на разных уровнях вложенности. В результате у модели появляется иерархия.
Для навигации по разным уровням модели используйте Панель навигации.
Такая подсистема называется классической. Она может быть невиртуальной или виртуальной:
- Невиртуальная подсистема выполняется как единое целое и может быть настроена на выполнение только при определенных событиях.
- Виртуальная подсистема не выполняется как единое целое и не зависит от событий. Такая подсистема помогает сделать модель более понятной, не влияя на ее работу.
Чтобы переключить виртуальную подсистему в невиртуальную, установите параметр Treat as atomic unit в значение true.
Примечание
Если нажать правой кнопкой мыши по подсистеме и выбрать команду Распаковать, то все блоки, находящиеся внутри подсистемы, будут перемещены в модель верхнего уровня с сохранением соединений, а сама подсистема будет удалена.
✏️Задание 1
Создайте классическую подсистему:
- Откройте модель
Синусоида с искажениями.engee.
Она состоит из блока Sine Wave, генерирующего синусоидальный сигнал, и двух блоков, моделирующих канал связи, в котором сигнал искажается: Gain (ослабление амплитуды сигнала в 2 раза) и AWGN Channel (добавление к сигналу аддитивного белого гауссовского шума с отношением сигнал/шум (Eb/No), равным 10 дБ). Выходной сигнал поступает на блок Terminator.
-
Из блоков Gain и AWGN Channel создайте подсистему: с нажатой клавишей Shift выделите эти блоки, нажмите на появившиеся точки в углу прямоугольника и выберите Подсистема
. -
Измените имя подсистемы с Subsystem на Communication Channel.
-
Залогируйте выходной сигнал подсистемы.
-
Запустите модель и постройте графики исходной синусоиды и синусоиды, прошедшей через канал связи.
Решение
Модель:
Подсистема Communication Channel:
График результатов моделирования:
Подсистемы, срабатывающие по условию
Это управляемые подсистемы, срабатывающие при выполнении определенного условия.
Активируемая подсистема
Активируемая подсистема (Enabled subsystem)
— это тип блока Subsystem, выполнение которого управляется внешним сигналом. Активируемая подсистема выполняется один раз на каждом основном временном шаге, пока управляющий сигнал имеет положительное значение.
Активируемая подсистема имеет следующие особенности:
- Блок Enabled (Порт активации) добавляет внешний сигнал для управления выполнением подсистемы.
- Управляющий сигнал может быть скаляром или вектором.
- Если скалярное значение больше нуля, то подсистема выполняется.
- Если хотя бы одно из значений вектора больше нуля, то подсистема выполняется.
Создать активируемую подсистему можно одним из двух способов:
- Добавить блок Subsystem на холст и добавить блок Enabled (Порт активации) в подсистему.
- Объединить нужные блоки в подсистему, нажав левую кнопку мыши и клавишу Shift, и выбрать Активируемая подсистема
. В этом случае блок Enabled будет добавлен автоматически.
✏️Задание 2
Создайте модель, в которой линейный сигнал подвергается задержке на шаг, если значение управляющего синусоидального сигнала больше нуля:
- Добавьте в модель блоки Ramp (Линейный сигнал), Unit Delay (Запаздывание на шаг) и Terminator (Заглушка). Соедините эти блоки последовательно. Параметры блоков оставьте равными по умолчанию.
- Выделите блок Unit Delay, нажмите на появившиеся точки в углу прямоугольника и выберите Активируемая подсистема
. В результате внутри подсистемы будут находиться блок Unit Delay, соединенный с входным и выходным портами In1 и Out1, а также блок Enable (Порт активации). - Сформируйте управляющий сигнал для активируемой подсистемы. Для этого добавьте в модель блок Sine Wave (Генератор синусоиды) и соедините его выход с управляющим (верхним) портом подсистемы.
- Залогируйте выходные сигналы блока Sine Wave и подсистемы.
- Запустите модель и постройте графики управляющего и выходного сигналов модели.
Решение
Модель:
Подсистема:
График результатов моделирования:
Триггируемая подсистема
Триггируемая подсистема (Triggered subsystem)
— это тип блока Subsystem, выполнение которого инициируется внешним сигналом триггера. Триггируемая подсистема будет выполняться один раз на каждом шаге, когда значение управляющего сигнала изменяется указанным способом.
Триггируемая подсистема имеет следующие особенности:
- Блок Trigger (Порт триггера) добавляет внешний сигнал для управления выполнением подсистемы.
- Триггируемая подсистема удерживает свои выходные параметры на последнем значении между триггерами.
- Состояния дискретных блоков внутри подсистемы сохраняются между триггерами.
Блок Trigger имеет параметр Trigger type (тип триггера), который может принимать значения:
rising(Передний фронт) — запуск выполнения подсистемы при повышении управляющего сигнала от отрицательного или нулевого значения до положительного;falling(Задний фронт) — запуск выполнения подсистемы, когда управляющий сигнал падает от положительного или нулевого значения до отрицательного;either(Любой фронт) — запуск выполнения подсистемы, когда управляющий сигнал либо нарастает, либо спадает;function-call(Вызов функции) — запуск выполнения подсистемы, когда управляющий сигнал получает событие вызова из блока Function-Call Generator (Генератор вызова функции).
Создать триггируемую подсистему можно одним из двух способов:
- Добавить блок Subsystem на холст и добавить блок Trigger (Порт триггера) в подсистему.
- Объединить нужные блоки в подсистему, нажав левую кнопку мыши и клавишу Shift, и выбрать Триггируемая подсистема
. В этом случае блок Trigger будет добавлен автоматически.
✏️Задание 3
Модифицируйте предыдущую модель, чтобы создать триггируемую подсистему:
- Зайдите в подсистему. Удалите из нее блоки Unit Delay и Enable. Добавьте в подсистему блок Trigger (Порт триггера).
- Выйдите в основную модель. Соедините выход блока Sine Wave с управляющим (верхним) портом подсистемы.
- Залогируйте выходной сигнал блока Ramp.
- Последовательно задавая значения параметра Trigger type блока Trigger равными
rising,fallingиeither, трижды запустите модель и постройте графики всех залогированных сигналов.
Решение
Модель:
Подсистема:
График результатов моделирования, если тип триггера равен rising:
График результатов моделирования, если тип триггера равен falling:
График результатов моделирования, если тип триггера равен either:
Триггируемая и активируемая подсистема
Триггируемая и активируемая подсистема (Triggered & enabled subsystem)
— это объединение функционала двух подсистем (триггируемой и активируемой) в одну подсистему. Такая подсистема будет выполняться только тогда, когда управляющий сигнал активации имеет положительное значение и происходит событие триггера.
Блок Trigger (Порт триггера) может быть добавлен к блоку Enabled (Порт активации) для получения триггируемой и активируемой подсистемы.
Триггируемая и активируемая подсистема имеет следующие особенности:
- Выполнение подсистемы управляется одновременно двумя внешними сигналами: сигналом триггера и сигналом активации.
- Подсистема должна быть активирована положительным значением скалярного или векторного сигнала.
- Подсистема удерживает свои выходные параметры на последнем значении между триггерами.
- Состояния дискретных блоков внутри подсистемы сохраняются между триггерами.
Создать триггируемую и активируемую подсистему можно одним из двух способов:
- Добавить блок Subsystem на холст и добавить блоки Trigger (Порт триггера) и Enabled (Порт активации) в подсистему.
- Объединить нужные блоки в подсистему, нажав левую кнопку мыши и клавишу Shift, и выбрать Триггируемая и активируемая подсистема
. В этом случае блоки Trigger и Enabled будут добавлены автоматически.
Сбрасываемая подсистема
Сбрасываемая подсистема (Resettable subsystem)
— это тип блока Subsystem, состояние блоков которого могут быть сброшены внешним триггером. Эта подсистема выполняется на каждом временном шаге, но состояния всех блоков внутри нее сбрасываются к их начальному состоянию, когда на порту Reset (Порт сброса) происходит триггерное событие.
Сбрасываемая подсистема имеет следующие особенности:
- Блок Reset (Порт сброса) добавляет внешний сигнал для управления выполнением подсистемы.
- Состояния всех блоков внутри подсистемы сбрасываются к начальному состоянию при срабатывании триггера на порту Reset.
- Подсистема выполняется на каждом временном шаге, но сбрасывает состояния блоков только при условии срабатывания триггера на порту Reset.
Создать сбрасываемую подсистему можно одним из двух способов:
- Добавить блок Подсистема на холст и добавить блок Reset (Порт сброса) в подсистему.
- Объединить нужные блоки в подсистему, нажав левую кнопку мыши и клавишу Shift, и выбрать Сбрасываемая подсистема
. В этом случае блок Reset будет добавлен автоматически.
Подсистема вызова функции (Function-Call)
Function-Call (Подсистема вызова функции)
— это тип блока Subsystem. Подсистема запускается каждый раз, когда порт управления получает событие вызова функции. Эти события могут поступать от блока Chart, блока Function-Call Generator или блока Engee Function.
Function-Call подсистема имеет следующие особенности:
- Блок Trigger (Порт триггера) с параметром Trigger Type в значении
function-callпревращается в блок Function и добавляет внешний сигнал для управления выполнением подсистемы. - Подсистема выполняется только при получении события вызова функции на порту управления.
- Вызов подсистемы инициирует выполнение всех блоков внутри нее в заданном порядке, аналогично функции в процедурном языке программирования.
Создать Function-Call подсистему можно одним из двух способов:
- Добавить блок Subsystem на холст и добавить блок Trigger (Порт триггера) в подсистему. Задать значение параметра Trigger Type равным
function-call. Блок Trigger сменит вид на Function. - Объединить нужные блоки в подсистему, нажав левую кнопку мыши и клавишу Shift, и выбрать Function-Call подсистема
. В этом случае блок Function будет добавлен автоматически.
✏️Задание 4
Откройте и запустите модель с Function-Call подсистемой:
- Откройте модель
Function-Call подсистема.engee, находящуюся в папке данного курса.
Модель с помощью блока Sine Wave генерирует синусоиду, которая поступает в Function-Call подсистему Subsystem.
По условию функции управления подсистема выполняет приращение счетчика.
Функция управления генерируется блоком Function-Call Generator, соединенным с управляющим портом подсистемы. Этот блок имеет следующие настройки:
- Запустите модель и постройте график выходного сигнала.
Решение
Логика управления
Action подсистема — это подсистема, выполнение которой контролируется сигналом действия блока Action Port (Порт действия). Подсистема используется в моделях, содержащих блоки Оператор If и Switch Case.
Action подсистема имеет следующие особенности:
- Блок Оператор If реализует логику if-else для управления выполнением Action подсистемы.
- Блок Switch Case реализует логику переключения для управления выполнением Action подсистемы.
- Сигнал действия управляет выполнением блоков внутри подсистемы аналогично конструкциям
ifиswitch–caseв языках программирования.
Как создать Action подсистему:
Добавить блок Subsystem на холст и добавить блок Action Port (Порт действия) в подсистему. Блок добавляет в подсистему внешний входной порт Action.
✏️Задание 5
Откройте и запустите Action подсистему:
- Откройте модель
If подсистема.engee, находящуюся в папке данного курса.
Модель с помощью блока Sine Wave генерирует синусоиду, которая поступает в блок Оператор If. В окне настроек блока Оператор If заданы следующие параметры:
Таким образом, если значение входной синусоиды больше нуля, то выполняется подсистема Subsystem, которая выдает на выходе ту же синусоиду. В противном случае (если значение входного сигнала меньше или равно нулю) выполняется подсистема Subsystem-1, которая выдает на выходе ту же самую синусоиду. В результате выходной сигнал первой подсистемы равен значениям входной синусоиды, если они положительные; в противном случае он равен нулю. Выходной сигнал второй подсистемы равен значениям входной синусоиды, если они меньше или равны нулю; в противном случае он равен нулю.
- Запустите модель и постройте графики выходных сигналов обеих подсистем.
Решение
Многократное выполнение
For Each (для каждого элемента)
For Each подсистема — это подсистема, которая позволяет обрабатывать каждый элемент входного сигнала. Управляющим блоком для такой подсистемы является блок For Each (Повторение для каждого).
For Each подсистема имеет следующие особенности:
- Подсистема обрабатывает каждый элемент входных сигналов.
- Каждый блок внутри подсистемы поддерживает отдельный набор состояний для каждого элемента или подмассива, который он обрабатывает.
- По мере обработки элементов или подмассивов подсистема объединяет результаты для формирования выходных сигналов.
Как создать For Each подсистему:
Добавить блок Subsystem на холст и добавить блок For Each (Повторение для каждого) в подсистему.
For Iterator (итеративная подсистема)
For Iterator подсистема — это итеративная подсистема с программируемой логикой For. Представляет собой подсистему, которая повторяет выполнение в течение текущего временного шага до тех пор, пока переменная итерации не превысит заданный предел итерации. Это позволяет реализовать логику, эквивалентную циклу for в Engee с помощью блока For Iterator (Итератор For).
Итеративная подсистема имеет следующие особенности:
- Подсистема выполняется повторно в течение текущего временного шага на основе переменной итерации.
- Блок For Iterator (Итератор For) управляет количеством итераций (параметр Iteration limit) аналогично циклу
for.
Как создать итеративную подсистему:
- Добавить блок Subsystem на холст и добавить блок For Iterator (Итератор For) в подсистему.
- Включить параметр Show iteration variable для появления выходного порта. Включить параметр Set next i (iteration variable externally) для появления входного порта. Определить количество итераций подсистемы с помощью параметра Iteration limit. С помощью параметра Index mode указать начальный номер итерации.
Создание моделей-ссылок с помощью блока Model
Model (Модель) — это блок, который ссылается на отдельный файл модели. Его можно встраивать в другие модели с помощью блока Model.
Модель-ссылка (или подмодель) используется:
- для создания иерархии системной модели;
- для повторного использования и распространения модулей между проектами;
- для разделения проекта на независимые части, которые могут разрабатываться и тестироваться отдельно.
Модель-ссылка имеет следующие особенности:
- В отличие от классической подсистемы, она уже должна находиться в файловой системе по пути поиска, чтобы ее можно было использовать в других моделях.
- Она отображает порты ввода и вывода, соответствующие портам ввода и вывода модели верхнего уровня. Эти порты позволяют подключать модель-ссылку к другим блокам родительской модели.
- Она может ссылаться на другую модель-ссылку и поддерживает многоуровневое вложение любых подсистем и моделей-ссылок.
Как создать модель-ссылку:
- Добавить блок Model на холст.
- В настройках блока указать на какую модель будет ссылаться ваша модель, нажав Выбрать модель.
- Для появления входных/выходных портов у блока Model добавьте блоки Input и Output в модель-ссылку и выберите опцию Обновить коннекторы:
Важно
- Размер шага решателя во всех моделях-ссылках должен совпадать с размером шага решателя родительской модели.
- Можно выбрать либо дискретные, либо непрерывные решатели. Использование обоих типов решателей одновременно вызовет ошибку решателя.
- Модели-ссылки не поддерживают блоки библиотеки Физическое моделирование и многомерные сигналы.
- Модели-ссылки поддерживают многоуровневое вложение подсистем и других блоков Model.
✏️Задание 6
Создайте модель-ссылку и используйте ее в основной модели. По функциональности ваша модель будет совпадать с моделью из Задания 1:
- Создайте новую модель. Добавьте в нее блоки In1, Gain, AWGN Channel и Out1. Последовательно соедините эти блоки.
- В окне настроек блока Gain задайте значение параметра Gain равным
0.5. - Сохраните модель в папке данного курса под именем
Communication Channel.engee. Это модель-ссылка. Она моделирует канал связи, в котором амплитуда сигнала ослабляется в 2 раза и к сигналу добавляется аддитивный белый гауссовский шум с отношением сигнал/шум, равным 10 дБ. - Создайте новую модель. Добавьте в модель блоки Sine Wave, Model и Terminator.
- Щелкните правой кнопкой мыши по блоку Model. В появившемся контекстном меню выберите Параметры. Откроется окно настроек блока Model. Нажмите кнопку Выбрать модель и выберите файл
Communication Channel.engee. Затем нажмите кнопку Обновить коннекторы. - У блока Model появятся входной и выходной порты. Последовательно соедините блоки Sine Wave, Model и Terminator.
- Сохраните модель в папке данного курса под именем
Модель.engee. Это основная модель, которая использует модель-ссылкуCommunication Channel.engee. - Запустите основную модель.
- Чтобы построить график выходного сигнала, запустите следующий скрипт:
using CSV, Plots
result = collect(simout["Модель/Model.Out1"])
CSV.write("result.csv", result)
plot(result.time, result.value)
Решение
Модель-ссылка:
Основная модель:
График результатов моделирования: